﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Negocio.clases_tontas;
using Datos;

namespace Negocio.catalogos
{
    public class catalogoDistribucion
    {
        DocenteServicio.DocenteServicioSoapClient _objServicioDocente = new DocenteServicio.DocenteServicioSoapClient();
        servicioEstudiante.EstudiantesServicioSoapClient _objServicioEstudiante = new servicioEstudiante.EstudiantesServicioSoapClient();

        ControlAsistenciaEntities _objConexion = new ControlAsistenciaEntities();
        /// <summary>
        /// Metodo para obtener los datos de la distribucion a traves del id docente
        /// </summary>
        /// <param name="_idDocente">filtro</param>
        /// <returns>distribuciones del docente</returns>
        public List<distribucion> obtenerDistribucion(int _idDocente)
        {
            List<distribucion> _listaDistribucion = new List<distribucion>();
            try
            {
                var resultDistribucion = _objServicioDocente.DistribucionXidDocente(_idDocente);

                foreach (var item in resultDistribucion)
                {
                    _listaDistribucion.Add(new distribucion(item.Cod_Distribucion, item.Nombre + " - " + item.Semestre + " "+  item.Paralelo, item.Nro_Horas, new catalogoCarrera().obtenerCarrera(_idDocente).Where(E => E.carrera == item.Carrera).First().idCarrera, item.Semestre, item.Paralelo));
                }
                return _listaDistribucion;
            }
            catch (Exception)
            {
                return _listaDistribucion;
            }
        }
        public List<distribucion> obtenerDistribucionDocentePeriodo(int _idDocente,int _periodo)
        {
            List<distribucion> _listaDistribucion = new List<distribucion>();
            try
            {
                var resultDistribucion = _objConexion.procconsultarDistribucionXidDocenteANDidPeriodo(_idDocente,_periodo);

                foreach (var item in resultDistribucion)
                {
                    _listaDistribucion.Add(new distribucion(item.Cod_Distribucion, item.Nombre + " - " + item.Semestre + " " + item.Paralelo, item.Nro_Horas, new catalogoCarrera().obtenerCarrera(_idDocente).Where(E => E.carrera == item.Carrera).First().idCarrera, item.Semestre, item.Paralelo));
                }
                return _listaDistribucion;
            }
            catch (Exception)
            {
                return _listaDistribucion;
            }
        }

        public List<distribucion> obtenerDistribucionXidAlumno(int _idAlumno, int _idPeriodo)
        {
            List<distribucion> _listaDistribucion = new List<distribucion>();
            try
            {
                var resultDistribucion = _objServicioEstudiante.ObtenerDistrubucionEstudiante(_idAlumno,_idPeriodo);

                foreach (var item in resultDistribucion)
                {
                    _listaDistribucion.Add(new distribucion(item.Cod_Distribucion, item.Cod_Distribucion + " " + item.Nombre, item.Id_Docente));
                }
                return _listaDistribucion;
            }
            catch (Exception)
            {
                return _listaDistribucion;
            }
        }

        /// <summary>
        /// obtener la distribuion por el codigo de la misma
        /// </summary>
        /// <param name="_codDistribucion">filtro</param>
        /// <returns>la unica distribucion requerida</returns>
        public List<distribucion> obtenerDistribucionId(int _codDistribucion) {
            List<distribucion> _lista = new List<distribucion>();
            try
            {
                var resultado =  _objConexion.procConsultarDistribucionesxIDDistribucion(_codDistribucion);
                foreach (var item in resultado)
                {
                    _lista.Add(new distribucion(item.Cod_Distribucion, item.Nombre + " - " + item.Semestre + " " + item.Paralelo, item.Nro_Horas, item.Cod_Carrera, item.Carrera, item.Semestre, item.Paralelo, item.Id_Docente));
                }
                return _lista;
            }
            catch (Exception)
            {

                return _lista;
            }
            
        }
        /// <summary>
        /// Obtiene la distribucion por el id carrera
        /// </summary>
        /// <param name="_idCarrera">filtro</param>
        /// <returns>lista</returns>
        public List<distribucion> obtenerDistribucionXIdCarrera(int _idCarrera)
        {

            List<distribucion> _lista = new List<distribucion>();
            try
            {
                var resultado = _objServicioDocente.DistribucionXidCarrera(_idCarrera);
                foreach (var item in resultado)
                {
                    _lista.Add(new distribucion(item.Cod_Distribucion, item.Nombre + " - " + item.Semestre + " " + item.Paralelo, item.Nro_Horas, item.Carrera, item.Semestre, item.Paralelo, item.Id_Docente));
                }
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }
        }
        /// <summary>
        /// obtiene la distribucion por el semestre y la carrera
        /// </summary>
        /// <param name="_semestre">filtro</param>
        /// <param name="_idCarrera">filtro</param>
        /// <returns>lista</returns>
        public List<distribucion> obtenerDistribucionXSemestre(int _semestre, int _idCarrera, string _paralelo)
        {
            List<distribucion> _lista = new List<distribucion>();
            try
            {
                var resultado = new catalogoDistribucion().obtenerDistribucionXIdCarrera(_idCarrera).Where(R => R.semestre == _semestre && R.paralelo == _paralelo);
                foreach (var item in resultado)
                {
                    _lista.Add(new distribucion(item.idDistribucion, item.Nombre, (int)item.horas, item.idCarrera, (int)item.semestre, item.paralelo, item.idDocente));
                }
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }
        }
        public List<distribucion> obtenerDistribucionXIdPeriodoXNombre(int _idPeriodo, string _nombre, int _idCarrera)
        {
            ControlAsistenciaEntities _objConexion = new ControlAsistenciaEntities();
            List<distribucion> _lista = new List<distribucion>();
            try
            {
                var resultado = _objConexion.procconsultarDistribucionXPeriodoAndNombre(_idPeriodo, _nombre, _idCarrera);
                foreach (var item in resultado)
                {
                    _lista.Add(new distribucion(item.Cod_Distribucion, item.Nombre + " - " + item.Semestre + " " + item.Paralelo, item.Nro_Horas, item.Carrera, item.Semestre, item.Paralelo, item.Id_Docente));
                }
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }
        }

    }
}
